package demo8

import "fmt"

/*
	本例的设计模式就是典型的生产者和消费者。
	生产者是第 40 行的循环，而消费者是 printer() 函数。
	整个例子使用了两个 goroutine，一个是 main()，一个是通过第 37 行 printer() 函数创建的 goroutine。
	两个 goroutine 通过第 34 行创建的通道进行通信。这个通道有下面两重功能。
		1. 数据传送：第 43 行中发送数据和第 17 行接收数据。
		2. 控制指令：类似于信号量的功能。同步 goroutine 的操作。
*/

func printer(c chan int) {
	// 开始无限循环等待数据
	for {
		// 从 channel 获取数据
		data := <-c

		// 把 0 视为数据结束
		if data == 0 {
			break
		}

		// 打印数据
		fmt.Println(data)
	}

	// 通知 main 已经循环结束
	c <- 0
}

// TestDemo85 将 goroutine 和 channel 结合使用
func TestDemo85() {
	// 创建 channel
	c := make(chan int)

	// 并发执行 printer, 传入 channel
	go printer(c)

	// 遍历传入数据
	for i := 1; i <= 10; i++ {
		// 将数据通过 channel 同送 printer
		c <- i
	}

	// 通知 printer 循环结束
	c <- 0

	// 等待 printer 结束
	<-c
}
